// 引入windi css
import '@/plugins/windi.css'

// 导入全局的svg图标
import '@/plugins/svgIcon'

// 初始化多语言
import { setupI18n } from '@/plugins/vueI18n'

// 引入状态管理
import { setupStore } from '@/store'

// 全局组件
import { setupGlobCom } from '@/components'



// 引入全局样式
import '@/styles/index.less'

// 引入动画
import '@/plugins/animate.css'

// 路由
import { setupRouter } from './router'

// 权限
import { setupPermission } from './directives'

import { createApp } from 'vue'

import App from './App.vue'

import './permission'

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'

import constant from '@/constant/index'
import api from '@/api/index'

import dateFormatter from '@/utils/dateFormatter.js'

import StringUtil from '@/utils/stringUtil.js'

import uploader from 'vue-simple-uploader'

import 'vue-simple-uploader/dist/style.css'

// web socket
import webSocket from '@/modules/notification/view/systemMessage/webSocket.js'


// 可自配置的网格布局
import VueGridLayout from 'vue-grid-layout'

// echart图表
import "echarts"
import ECharts from "vue-echarts"

// 表单构建器
import FormCreate from '@form-create/element-ui'
import FcDesigner from '@form-create/designer'


import { Base64 } from 'js-base64'

// 自定义组件

import DictionarySelect from '@/components/abc/DictionarySelect/DictionarySelect.vue'
import DictionaryRadioGroup from '@/components/abc/DictionarySelect/DictionaryRadioGroup.vue'
import OrganizationSingleSelect from '@/modules/system/view/organization/treeReference.vue'
import OrganizationMultipleSelect from '@/modules/system/view/organization/treeMultipleSelect.vue'
import UserSingleSelect from '@/modules/system/view/user/treeListReference.vue'
import IconPicker from '@/components/abc/IconPicker/index.vue'
import { Editor } from '@/components/abc/Editor'
import AttachmentUploader from '@/modules/support/view/attachment/attachmentUploader.vue'
import AttachmentManager from '@/modules/support/view/attachment/attachmentManager.vue'
import AttachmentViewer from '@/modules/support/view/attachment/attachmentViewer.vue'
import AttachmentManagerAndUploader from '@/modules/support/view/attachment/attachmentManagerAndUploader.vue'

FormCreate.component(DictionarySelect)
FormCreate.component(DictionaryRadioGroup)
FormCreate.component(OrganizationSingleSelect)
FormCreate.component(OrganizationMultipleSelect)
FormCreate.component(UserSingleSelect)
FormCreate.component(IconPicker)
FormCreate.component(Editor)
FormCreate.component(AttachmentUploader)
FormCreate.component(AttachmentManager)
FormCreate.component(AttachmentViewer)
FormCreate.component(AttachmentManagerAndUploader)


// 创建实例
const setupAll = async () => {
  const app = createApp(App)

  await setupI18n(app)

  setupStore(app)

  setupGlobCom(app)

  setupRouter(app)

  setupPermission(app)

  // 全量注册element-plus组件
  app.use(ElementPlus)

  // 自定义表单
  app.use(FormCreate)
  app.use(FcDesigner)

  // 全量注册element-plus图标
  app.config.globalProperties.$icons = []
  for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
    // 将图标键值放入全局变量，用于图标选择器
    app.config.globalProperties.$icons.push(key)
  }

  // 挂载全局变量，兼容2.0习惯写法
  app.config.globalProperties.$constant = constant

  app.config.globalProperties.$api = api

  // 日期函数
  app.config.globalProperties.$dateFormatter = dateFormatter

  // 字符串工具函数
  app.config.globalProperties.$StringUtil = StringUtil

  // web socket
  app.config.globalProperties.$webSocket = webSocket

  // base64工具类
   app.config.globalProperties.$base64Util = Base64

  // 文件上传
  app.use(uploader)

  // 可自配置的网格布局
  app.use(VueGridLayout)

  // echart图表
  app.component('v-chart', ECharts)

  app.mount('#app')

  app.directive('focus', {
    mounted(el) {
      el.focus()
    }
  })

  app.directive('enterNumber', {
    mounted(el, { value = 100 }, vnode) {
      el = el.nodeName == "INPUT" ? el : el.children[0]
      var RegStr = value == 0 ? `^[\\+\\-]?\\d+\\d{0,0}` : `^[\\+\\-]?\\d+\\.?\\d{0,${value}}`
      el.addEventListener('input', function () {
        el.value = el.value.match(new RegExp(RegStr, 'g'));
        el.dispatchEvent(new Event('input'))
      })
    }
  })
  
}

setupAll()
